package com.ming.study.exceptionHandler;

import com.ming.study.utils.R;
import com.ming.study.utils.ResultCode;
import com.ming.study.utils.ResultCodeImpl;
import io.jsonwebtoken.ExpiredJwtException;
import io.jsonwebtoken.JwtException;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.Objects;

// 统一异常
@ControllerAdvice
public class GlobalExceptionHandler {
    // 什么异常执行
    @ExceptionHandler(Exception.class)
    @ResponseBody
    public R error(Exception e) {
        e.printStackTrace();
        return R.error().message(e.getMessage());
    }

    // 自定义异常
    @ExceptionHandler(MingException.class)
    @ResponseBody
    public R error(MingException e) {
        return R.error()
                .code(e.getCode())
                .message(e.getMsg());
    }

    // 表单数据验证异常
    @ExceptionHandler(MethodArgumentNotValidException.class)
    @ResponseBody
    public R error(MethodArgumentNotValidException e) {
        return R.error()
                .message(Objects.requireNonNull(e.getBindingResult().getFieldError()).getDefaultMessage());
    }

    // jwt异常
    @ExceptionHandler(ExpiredJwtException.class)
    @ResponseBody
    public R error(ExpiredJwtException e) {
        return R.create(ResultCodeImpl.NOT_LOGIN).message("登录过期");
    }

    @ExceptionHandler(JwtException.class)
    @ResponseBody
    public R error(JwtException e) {
        return R.create(ResultCodeImpl.NOT_LOGIN).message("Token无效");
    }


}
